Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Фабрика объектов JavaScript (An6rey)
Author Message
An6rey
Участник форума



Joined: 30 Aug 2007
Posts: 69
Карма: 3
   поощрить/наказать


PostPosted: Wed Nov 19, 2008 7:53 pm (написано за 18 минут 58 секунд)
   Post subject: Фабрика объектов JavaScript
Reply with quote

В подавляющием большинстве библиотек JavaScript, которые манипулруют объектами, код инициализации выносится из конструктора в метод init() или аналогичный, в то время как конструктор остается пустой. У такого решения есть две очевидные причины:
1) при реализации наследования в стиле Child.prototype = new Parent() объект создается, но "лишний" код инициализации прототипа не выполняется;
2) при реализации фабричных методов (напр. create()) возможно вызвать инициализатор init() с произвольным количеством параметров;
Code (JavaScript): скопировать код в буфер обмена
function create(functionConstructor){
  var newObject = new functionConstructor();
  var  newArguments = [].concat(arguments).slice(1); // некроссбраузерно
  //var  newArguments = []; Так будет работать и в IE
  //for (var i = 1; i < arguments.length; i++)   
  //  newArguments[i-1] = arguments[i];
  newObject.init.apply(newObject, newArguments);
  return newObject;
}
Мне не нравится использование "магических" методов, в частности, потому что, возможно, я захочу создвать не только объекты, которые разработал сам, но и объекты соторнних разработчиков, которые не имеют понятия об init(). В конце концов я нашел вариант. который может показаться довольно странным, но тем не менее он работает:
Code (JavaScript): скопировать код в буфер обмена
function Fabrica(){}
Fabrica.nativePrototype = Fabrica.prototype;

function create(functionConstructor){
  Fabrica.prototype =  functionConstructor.prototype;
  var newObject = new Fabrica();
  Fabrica.prototype =  Fabrica.nativePrototype;
  var  newArguments = [].concat(arguments).slice(1); // некроссбраузерно
  //var  newArguments = []; Так будет работать и в IE
  //  for (var i = 1; i < arguments.length; i++)   
  //  newArguments[i-1] = arguments[i];
  functionConstructor.apply(newObject, newArguments);
  return newObject;
}
Я протестировал этот код на очевидных примерах и использую его в своей практической работе:
Code (JavaScript): скопировать код в буфер обмена
function Object0(var0, var1) {
  this.prop0 = var0;
  this.prop1 = var1;
}

Object0.prototype.validate = function(){
  alert(this.constructor);
  alert(this instanceof Object0);
  alert(this.prop0+"//"+this.prop1);
}

function Object1(var0, var1, var2) {
  this.prop0 = var0;
  this.prop1 = var1;
  this.prop2 = var2;
}

Object1.prototype.validate = function(){
  alert(this.constructor);
  alert(this instanceof Object1);
  alert(this.prop0+"//"+this.prop1+"//"+this.prop2);
}

objRef0 = create(Object0, 1, 2);
objRef1 = create(Object1, 1, 2, 3);
objRef00 = create(Object0, 3, 4);
objRef11 = create(Object1, 4, 5, 6);

objRef0.validate();
objRef1.validate();
objRef00.validate();
objRef11.validate();
Хотел бы выслушать мнения об этой возможности, для чего открыл топик в разделе Разное JavaScript forum.dklab.ru/viewtopic.php?t=31930

Last edited by An6rey on Thu Nov 20, 2008 12:36 am; edited 4 times in total
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Wed Nov 19, 2008 8:27 pm (спустя 33 минуты; написано за 2 минуты 51 секунду)
   Post subject:
Reply with quote

Code (any language): скопировать код в буфер обмена
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

function Object0(var0, var1) {
  this.prop0 = var0;
  this.prop1 = var1;
}
-1
undefined//undefined
function Object1(var0, var1, var2) {
  this.prop0 = var0;
  this.prop1 = var1;
  this.prop2 = var2;
}
-1
undefined//undefined//undefined
function Object0(var0, var1) {
  this.prop0 = var0;
  this.prop1 = var1;
}
-1
undefined//undefined
function Object1(var0, var1, var2) {
  this.prop0 = var0;
  this.prop1 = var1;
  this.prop2 = var2;
}
-1
undefined//undefined//undefined
разве это должны были мы увидеть из ваших примеров?
Back to top
View user's profile Send private message
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9985
   поощрить/наказать


PostPosted: Wed Nov 19, 2008 8:30 pm (спустя 2 минуты; написано за 1 минуту 25 секунд)
   Post subject:
Reply with quote


М

An6rey, Вы правила этого подфорума читали?

Если хотите обсуждения — создайте дополнительно тему в "JavaScript :: Разное" и дайте тут на неё ссылку.
Здесь обсуждения запрещены. Исключение — только для сообщений об ошибках/багах.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML